[HVM][SVM] Revert changeset 11679:a949bd6ceb85
authorkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Fri, 6 Oct 2006 07:09:52 +0000 (08:09 +0100)
committerkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Fri, 6 Oct 2006 07:09:52 +0000 (08:09 +0100)
Although in the correct spirit, it seems there is some other
dependency in the code that assumes ExtInts are queued until
thay can be immediately delivered (EFLAGS.IF==1). This patch
therefore caused instability in Linux guests.

Signed-off-by: Keir Fraser <keir@xensource.com>
xen/arch/x86/hvm/svm/intr.c

index 063e919cb3451f14782616106fb7b03f8ccbfa3e..0f30bd5478c176dc04e337d8e5daae373c6eabdc 100644 (file)
@@ -74,6 +74,7 @@ asmlinkage void svm_intr_assist(void)
     int intr_type = APIC_DM_EXTINT;
     int intr_vector = -1;
     int re_injecting = 0;
+    unsigned long rflags;
 
     ASSERT(vmcb);
 
@@ -86,6 +87,14 @@ asmlinkage void svm_intr_assist(void)
         re_injecting = 1;
     }
 
+    /* Guest's interrputs masked? */
+    rflags = vmcb->rflags;
+    if (irq_masked(rflags)) {
+        HVM_DBG_LOG(DBG_LEVEL_1, "Guest IRQs masked: rflags: %lx", rflags);
+        /* bail out, we won't be injecting an interrupt this time */
+        return;
+    }
+    
     /* Previous interrupt still pending? */
     if (vmcb->vintr.fields.irq) {
 //        printk("Re-injecting IRQ from Vintr\n");